# -*- coding: utf-8 -*-
import os.path
import re
import uiautomator2 as u2
import time
import logging
from uiautomator2 import UiObject

from weixin_modules.inner_settings import file_log
from weixin_modules.retry import retries

# 符号说明：
# -> 上下页面关系
# => 同一页面元素关系，页面内元素关系

# 轮询间隔睡眠
# 这个模块全局 设为 1.5秒
sleep_for_polling_interval = 1.5
# 设置超时 为120秒，超过 120秒，抛异常
# timeout = 60
wechat_timeout = 60
logger = logging.getLogger("uiauto_weixin.weixin_modules.wechat")


class WeChatBasic(object):
    # 封闭微信的界面元素，
    def __init__(self, serialno_url):
        # AdbDevice 对象用于uiautomator2无法实现的功能，
        # 例如：   switch_airplane 开关飞行模式，
        #           switch_wifi  开关wifi
        # self.adbDevice = adbDevice
        self.d = u2.connect(serialno_url)
        info_dict = self.d.device_info
        self.serial = info_dict["serial"]
        self.prop = "brand:{brand}, model:{model}, serial:{serial}".format(**info_dict)
        # 信息内容区域,可点击区域,
        self.info_area = None
        self.wechat_package = "com.tencent.mm"
        self.d.set_fastinput_ime(True)
        self.adb = self.d._adb_device

    """
    通用的基本操作
    """

    def key_back(self):
        """
        点击 返回键
        :return:
        """
        # keyevent 方法 直接调用 shell，更直接
        # 比 press方法更直接，
        self.d.keyevent("BACK")
        # self.d.press("back")

    def keyback_wait_for_disappearance(self, ui: UiObject):
        """
        点击 返回，并等待当前元素消失，
        keyback ，原操作是没有加等待的，
        所以这里先等待，再判断
        :return:
        """
        self.key_back()
        start = time.time()
        time.sleep(sleep_for_polling_interval)
        while ui.exists():
            self.key_back()
            time.sleep(sleep_for_polling_interval)
            if time.time() - start > wechat_timeout:
                logger.error("返回后，UI元素没有消失，超时了，请检查")
                raise Exception('返回后，UI元素没有消失，超时了，请检查')

    def is_in_weixinapp(self):
        """
        判断当前界面是否在微信界面，
        :return:
        """
        current_appinfo = self.d.app_current()
        current_package = current_appinfo["package"]
        if current_package == 'com.tencent.mm':
            return True
        return False

    def debug_save(self, phone_serial):
        """
        调试某个手机是 保存截图和xml文件
        :param phone_serial:
        :return:
        """
        time.sleep(1)
        logger.debug("保存截图和xml文件")
        # 主要是m6 经常出现问题，所以，m6需要返回第2次时，
        # 截图，保存xml,
        current_datetime = time.strftime("%Y-%m-%d %H-%M-%S", time.localtime())
        folder_path = os.path.join(file_log, phone_serial, "debug")
        if not os.path.exists(folder_path):
            os.makedirs(folder_path)
        screenshot_name = os.path.join(folder_path, current_datetime + ".jpg")
        xml_name = os.path.join(folder_path, current_datetime + ".xml")
        ####################################
        logger.debug(f"截图：{screenshot_name}")
        self.d.screenshot(screenshot_name)
        logger.debug(f"xml文件：{xml_name}")
        xml = self.d.dump_hierarchy()
        with open(xml_name, "w") as f:
            f.write(xml)

    def keyback_wait_for_appearance(self, ui: UiObject, timeout=3):
        """
        点击 返回，并等待新的元素出现，
        :param ui:
        :return:
        """
        logger.debug("keyback_wait_for_appearance")
        self.key_back()
        dealline = time.time() + wechat_timeout
        while not ui.wait(timeout=timeout):
            logger.debug("进入循环 key_back")
            self.key_back()
            # self.debug_save("721QADRP232N4")
            if time.time() > dealline:
                logger.error('返回后，UI元素没有出现，超时了，请检查')
                raise Exception('返回后，UI元素没有出现，超时了，请检查')
            if not self.is_in_weixinapp():
                logger.error("keyback_wait_for_appearance,已经跳出微信了")
                raise Exception("已经跳出微信了")

    def keyback_wait_for_appearance2(self, *args):
        """
        点击 返回，并等待新的元素出现，
        :param ui:
        :return:
        """
        logger.debug("keyback_wait_for_appearance")
        self.key_back()
        dealline = time.time() + wechat_timeout
        while True:
            n = 0
            flag = False
            for arg in args:
                n += 1
                if arg.wait(timeout=2):
                    logger.debug(f"判断次数：{n}")
                    flag = True
                    break
            if flag:
                break
            logger.debug("进入循环 key_back")
            self.key_back()
            if time.time() > dealline:
                raise Exception('返回后，UI元素没有出现，超时了，请检查')
            if not self.is_in_weixinapp():
                logger.error("keyback_wait_for_appearance,已经跳出微信了")
                raise Exception("已经跳出微信了")

    def keyback_homepage(self, timeout=2):
        """
        判断是否在首页，
        从其它页面，返回首页
        :return:
        """
        logger.debug("keyback_homepage")
        dealline = time.time() + wechat_timeout
        while not self.navbar.wait(timeout=timeout):
            self.key_back()
            logger.debug("进入循环 key_back")
            # self.debug_save("721QADRP232N4")
            if time.time() > dealline:
                raise Exception('返回后，UI元素没有出现，超时了，请检查')
            # {'package': 'com.meizu.flyme.launcher', 'activity': 'com.meizu.flyme.launcher.Launcher'}
            # {'package': 'com.tencent.mm', 'activity': 'com.tencent.mm.ui.LauncherUI'}
            if not self.is_in_weixinapp():
                logger.debug("keyback_homepage,已经跳出微信了")
                raise Exception("已经跳出微信了")

    def double_click(self, ui_object):
        """
        poco 没有实现，双击，
        只能自己实现，
        把相对坐标，转换为绝对坐标，
        然后调用airtest.Android.double_click
        :return:
        """
        point = ui_object.center()
        self.d.double_click(*point)

    def to_top(self):
        """
        微信 让信息流回到顶部
        :return:
        """
        point = self.d(resourceId="android:id/text1").center()
        self.d.double_click(*point)

    def swipe_up(self, start, time=1.0):
        """
        向上划，
        swipe_ext,中的scale是屏幕中间的部分，
        :param start:起始的 相对坐标 y
        :param time: 划动的时间，
        :return:
        """
        self.d.swipe(0.5, start, 0.5, 0.1, duration=time)

    def swipe_to_top(self, rows):
        """
        信息行 row,从 第-2个，上划到第0个
        代替drag_to
        :return:
        """
        if len(rows) > 8:
            start = rows[-2].center()
            end = rows[0].center()
            # start end 都是元组，用*解包
            self.d.swipe(*start, *end, steps=50)

    @retries(max_tries=3)
    def is_locked(self):
        """
        Perform `adb shell dumpsys window policy` command and search for information if screen is locked or not

        Raises:
            AirtestError: if lock screen can't be detected

        Returns:
            True or False whether the screen is locked or not

        """
        lockScreenRE = re.compile('(?:mShowingLockscreen|isStatusBarKeyguard|showing)=(true|false)')
        m = lockScreenRE.search(self.adb.shell('dumpsys window policy'))
        if not m:
            raise Exception("Couldn't determine screen lock state")
        return (m.group(1) == 'true')

    def wake(self):
        """
        唤醒手机，解锁屏幕，
        https://blog.csdn.net/weixin_44867493/article/details/105811826
        学习案例

        :return:
        """
        # 唤醒手机,
        # self.dev.wake()
        # self.d.screen_on()
        # self.d.keyevent()
        # self.d.press()
        # 先尝试连续发送224和82解锁屏幕，如果解锁失败，再试用yosemite解锁
        self.adb.keyevent("KEYCODE_WAKEUP")
        if self.is_locked():
            print("1次是锁屏状态")
            self.adb.keyevent("KEYCODE_MENU")
            time.sleep(0.5)
        if self.is_locked():
            print("2次是锁屏状态")
            self.adb.keyevent("HOME")
            self.d.swipe(0.1, 0.9, 0.9, 0.1)

    def screen_turn_off(self):
        self.d.screen_off()

    def switch_to_wechat(self):
        """
        切换到微信界面
        :return:
        """
        # 微信包名：com.tencent.mm
        app_info_dict = self.d.app_current()
        app_name = app_info_dict["package"]
        logger.debug(f"当前运行的app是：{app_name}")
        logger.debug("启动微信")
        # self.d.app_start('com.tencent.mm')
        self.d.app_start(package_name=self.wechat_package, activity='com.tencent.mm.ui.LauncherUI', wait=True, stop=True,
                         use_monkey=True)
        pid = self.d.app_wait(self.wechat_package)  # 等待应用运行, return pid(int)
        if not pid:
            print("com.example.android is not running")
        else:
            print("com.example.android pid is %d" % pid)

        self.d.app_wait(self.wechat_package, front=True)  # 等待应用前台运行
        # d.app_wait(self.wechat_package, timeout=20.0)  # 最长等待时间20s（默认）


    def get_info_area(self):
        """
        找到信息流，可点击区域的上下边界，
        :return:
        """
        # 点击 底部导航栏的 >微信<
        self.navbar_weixin.click()
        top_line = self.weixin_title_bar.bounds()[3]
        bottom_line = self.weixin_bottom_navigation_bar.bounds()[1]
        return [top_line, bottom_line]

    def is_clickable(self, ui: UiObject):
        """
        判断当前相对位置 是否可以点击,
        是否被标题栏和导航栏 遮挡,
        :param pos:
        :return:
        """
        pos = ui.center()
        if self.info_area[0] < pos[1] < self.info_area[1]:
            # 在区域内,可点击,
            return True
        else:
            return False

    def is_closed(self, ui: UiObject):
        """
        判断 群聊信息 界面 的开关按钮的状态，
        :param ui:
        :return:
        """
        # self.debug_save("721QADRP232N4")
        pos = ui.center(offset=(0.3, 0.5))
        # logger.debug(f"当前元素的中心点是：{pos}")
        rgb = self.d.image.getpixel(*pos)
        # logger.debug(f"当前元素的中心点的颜色是：{rgb}")
        return all(i == rgb[0] for i in rgb)


class wechat(WeChatBasic):
    def __init__(self, serialno_url):
        super().__init__(serialno_url)
        ##################################################################
        # UI参数是字符串，
        """
        我->设置->通用->存储空间->聊天记录空间管理
        信息行
        :return:
        """
        self.text_settings_records_rows_count = "com.tencent.mm:id/c2h"




        ###################################################################
        # UI参数是列表，放的 uiobject的对象，
        # 导航栏
        self.pro_navbar = [self.d(resourceId="com.tencent.mm:id/f2a")]
        self.pro_navbar_me = [self.d(resourceId="com.tencent.mm:id/f2a")[3],
                              self.d(text="我"),
                              self.d(resourceId="com.tencent.mm:id/h7q", text="我"),
                              self.d(resourceId="com.tencent.mm:id/icon_tv", text="我"),
                              self.d(resourceId="com.tencent.mm:id/icon_tv")[3]]
        self.pro_settings_cache_popup_clear = [self.d(resourceId="com.tencent.mm:id/guw"),
                                               self.d(resourceId="com.tencent.mm:id/mm_alert_ok_btn"),
                                               self.d(text="清理"),
                                               self.d(resourceId="com.tencent.mm:id/jln")]




    """
    微信首页 界面元素，
    """

    @property
    def navbar(self):
        """
        返回导航栏对象
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/f2a", className="android.widget.ImageView")

    @property
    def navbar_weixin(self):
        """
        微信 首页 导航栏  微信
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/f2a", className="android.widget.ImageView")[0]

    @property
    def navbar_book(self):
        """
        微信 首页 导航栏 通讯录
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/f2a", className="android.widget.ImageView")[1]

    @property
    def navbar_discover(self):
        """
         微信 首页 导航栏 发现
         :return:
         """
        return self.d(resourceId="com.tencent.mm:id/f2a")[2]

    @property
    def navbar_me(self):
        """
          微信 首页 导航栏 我
          :return:
        """
        return self.d(resourceId="com.tencent.mm:id/f2a")[3]

    @property
    def navbar_me_2(self):
        """
        微信 首页 导航栏 我  第2种选定方式，
        为了IQOO手机，
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/f2a")[3]

    # # 微信导航--微信， 界面元素
    @property
    def weixin_title_bar(self):
        """
        微信导航--微信,上部 标题栏

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/do")

    @property
    def share_title(self):
        """
        微信导航--微信,上部,标题栏中 的标题
                其实在当前界面有两个，
                上级结点不一样，
                1 上级 android:id/content
                2 上级 com.tencent.mm:id/do

        群 信息界面的标题，
        导航-通讯录 界面 的标题，
        导航-通讯录-群聊 界面的标题
        type :  android.widget.TextView
	    name :  android:id/text1
	    text :  聊天信息(161)

        导航-发现 界面的标题

        :return: 元素列表
        """
        return self.d(resourceId="android:id/text1")

    @property
    def weixin_button_search(self):
        """
        微信导航--微信,上部,标题栏中 搜索按钮
        在 MEIZU 手机中，这相结点名与 其它手机的不一样，所以判断一下，
        :return:
        """
        if self.d(resourceId="com.tencent.mm:id/j5t").wait(timeout=1):
            return self.d(resourceId="com.tencent.mm:id/j5t")
        else:
            return self.d(resourceId="com.tencent.mm:id/gsl")

    @property
    def weixin_input_box(self):
        """
        通用元素
        微信导航--微信--按钮 搜索 --输入框
        通讯录 -> 群聊 => 按钮<搜索> -> 搜索框
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/cd7", className="android.widget.EditText")

    @property
    def weixin_search_results(self):
        """
        微信导航--微信--按钮 搜索 --输入框
        输入文字后，会自动 出结果
        结果是列表，
        :return: 列表，
        """
        return self.d(resourceId="com.tencent.mm:id/kpm")

    @property
    def weixin_bottom_navigation_bar(self):
        """
        微信导航--微信,底部导航栏的 上级框架总结点
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/fj3")

    @property
    def table_rows(self):
        """
        微信导航--微信，信息流，元素列表
        通讯录页面，好友标签 列表
        :return:
        """
        # return self.d(resourceId="com.tencent.mm:id/hg4", className="android.view.View")
        return self.d(resourceId="com.tencent.mm:id/hg4")

    @property
    def bth_redtip(self):
        """
        红点提示，
        腾讯新闻，好友信息，企业通知 ，微信群
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/kmv", className="android.widget.TextView")

    @property
    def bth_redtip2(self):
        """
        红点提示，
        # # 公众号，订阅号，折叠的群聊，
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/a2f", className="android.widget.ImageView")

    @property
    def bth_redtip_name(self):
        """
        红点,所在的bth,聊天hg4,名字,
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/kmv").right(resourceId="com.tencent.mm:id/hg4")

    """
    微信导航--微信--功能--折叠的群聊
    """

    @property
    def weixin_FoldedRooms_title(self):
        """
        微信导航--微信--功能--折叠的群聊 界面的标题
        type :  android.widget.TextView
	    name :  com.tencent.mm:id/ko4
	    text :  折叠的群聊

        :return:
        """
        return self.d(text="折叠的群聊")

    """
    微信导航--微信，-聊天窗口界面，界面元素
    聊天窗口，界面
    包括与好友聊天，
    包括与群聊天，
    包括与公众号等等，
    
    """

    @property
    def chat_interface_back(self):
        """
        聊天窗口，左上角 < 返回按钮，
        做成通用的，

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/g0")

    @property
    def chat_interface_back1(self):
        """
        聊天窗口，左上角 < 返回按钮，
        微信支付,微信团队,服务通知,折叠的群聊,公众号,好友,微信群

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/yn")

    @property
    def chat_interface_back2(self):
        """
        聊天窗口，左上角 < 返回按钮，
        腾讯新闻,,订阅号消息

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/g1")

    @property
    def subscription_account(self):
        """
        订阅号，
        :return:
        """
        return self.d(description="订阅号消息")

    @property
    def chat_interface_title_common(self):
        """
        聊天窗口，上标题
        通用的选择方法，包括好友，微信群，微信功能，公众号等等，
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/fe").child(className="android.widget.TextView")

    @property
    def chat_interface_title(self):
        """
        与好友，聊天窗口，上标题
        群 聊天窗口，上标题，
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/ko4", className="android.widget.TextView")

    @property
    def chat_interface_title2(self):
        """
        与好友，聊天窗口，上标题
        群 聊天窗口，上标题，

        在折叠的群聊中   群聊天界面，会出现两个 ko4
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/ko4")[1]

    @property
    def chat_interface_info(self):
        """
        聊天窗口，右上角 ...
        与好友聊天窗口，与群聊天窗口，通用
        type :  android.widget.ImageView
	    name :  com.tencent.mm:id/eo
	    desc :  聊天信息

        :return:
        """
        # if self.d(resourceId="com.tencent.mm:id/eo").wait(timeout=0.5):
        ui = self.d(resourceId="com.tencent.mm:id/eo")
        # if self.serial == "TMENW19C18001585":
        #     ui = self.d(resourceId="com.tencent.mm:id/by3")
        return ui
        # elif self.d(resourceId="com.tencent.mm:id/eq").wait(timeout=0.5):
        #     return self.d(resourceId="com.tencent.mm:id/eq")
        # else:
        #     raise Exception("没有找到元素，右上角三个点")

    @property
    def chat_interface_edittext(self):
        """
        聊天窗口界面的输入框
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/b4a", className="android.widget.EditText")
        # if self.d(resourceId="com.tencent.mm:id/b4a").wait(timeout=1):
        #     print("聊天窗口界面的输入框 : {}".format("com.tencent.mm:id/b4a"))
        #     return self.d(resourceId="com.tencent.mm:id/b4a")
        # if self.d(className="android.widget.EditText").wait(timeout=1):
        #     print("聊天窗口界面的输入框 : {}".format("android.widget.EditText"))
        #     return self.d(className="android.widget.EditText")
        # print("聊天窗口界面的输入框 : {}".format('//android.widget.EditText'))
        # return self.d.xpath('//android.widget.EditText')

    @property
    def chat_interface_send(self):
        """
        聊天窗口界面
        输入框=> 按钮<发送>
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/b8k", className="android.widget.Button")

    @property
    def chat_interface_removed_tip(self):
        """
        当前微信用户被移出群聊，再进入群聊，会出现提示
        type :  android.widget.TextView
	    name :  com.tencent.mm:id/b59
	    text :  无法在已退出的群聊中发送消息
        被移出群聊后显示：无法在已退出的群聊中发送消息
        群主解散群后显示：无法在已停用的群聊中发送消息

        公众号的导航 菜单栏，也是b59
        例：
        d(resourceId="com.tencent.mm:id/b59", text="小程序商城")
        d(resourceId="com.tencent.mm:id/b59", text="话机通信")
        d(resourceId="com.tencent.mm:id/b59", text="会员服务")
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/b59")

    # 微信导航--通讯录， 界面元素
    @property
    def book_new_friend(self):
        """
        通讯录界面，新的朋友
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/knx")

    @property
    def book_room(self):
        """
        通讯录中的 群聊 标签，
        :return:
        """
        return self.d(text="群聊")

    @property
    def book_room_rows(self):
        """
        通讯录 => 群聊 -> 群列表
        :return:
        """
        return self.d(resourceId='com.tencent.mm:id/bqu')

    @property
    def book_room_search(self):
        """
        通讯录--群聊--搜索框
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/gs5")

    @property
    def book_friend_invitations(self):
        """
        通讯录=> 好友邀请提示
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/eb7")

    @property
    def book_label_newfriend(self):
        """
        通讯录=> 新的朋友
        :return:
        """
        return self.d(text="新的朋友")

    @property
    def new_friends_add(self):
        """
        按钮添加朋友
        :return:
        """
        return self.d(text="添加朋友")

    @property
    def new_friend_accept(self):
        """
        接受按钮
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/eb6", className="android.widget.Button")

    @property
    def new_friend_through(self):
        """
        通过好友验证界面的标题，
        :return:
        """
        return self.d(text="通过朋友验证")

    @property
    def new_friend_accept_done(self):
        """
        通过好友验证界面的 完成按钮
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/e9q")

    @property
    def book_public_account(self):
        """
        通讯录中的公众号标签，
        :return:
        """
        return self.d(text="公众号")

    @property
    def book_wxwork_friends(self):
        """
        通讯录中的 企业微信联系人 标签
        :return:
        """
        return self.d(text="企业微信联系人")

    @property
    def book_friend_row(self):
        """
        通讯录中的，好友信息行，

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/hg4", className="android.widget.TextView")

    @property
    def book_bottom_tip(self):
        """
        通讯录 底部的 提示，
        例：
                226个朋友
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bmm")

    # 微信导航--我， 界面元素
    @property
    def me_nick_name(self):
        """
        当前微信号的 昵称
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/hfq")

    @property
    def me_wxid(self):
        """
        当前微信的 wxid
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/l29")

    @property
    def me_settings(self):
        """
        页面 我
        按钮<设置>
        :return:
        """
        return self.d(resourceId="android:id/title", text="设置")

    @property
    def me_settings_title(self):
        """
        我->设置
        标题 设置
        :return:
        """
        return self.d(resourceId="android:id/text1", text="设置")

    @property
    def settings_universal(self):
        """
        我->设置
        按钮<通用>
        :return:
        """
        return self.d(resourceId="android:id/title", text="通用")

    @property
    def settings_universal_title(self):
        """
        我->设置->通用
        标题 通用
        :return:
        """
        return self.d(resourceId="android:id/text1", text="通用")

    @property
    def settings_storage_space(self):
        """
        我->设置->通用
        按钮 <存储空间>
        :return:
        """
        return self.d(resourceId="android:id/title", text="存储空间")

    @property
    def settings_storage_space_title(self):
        """
        我->设置->通用->存储空间
        标题 存储空间
        :return:
        """
        return self.d(resourceId="android:id/text1", text="存储空间")

    @property
    def settings_all_space(self):
        """
        我->设置->通用->存储空间
        微信已用空间
            --正在计算（空间数据）
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/lnu")

    @property
    def settings_cache_count(self):
        """
        我->设置->通用->存储空间
        缓存->正在计算（缓存数据）
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/apg")

    @property
    def settings_goto_clear(self):
        """
        我->设置->通用->存储空间
        缓存->前往清理 按钮
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/lno")

    @property
    def settings_cache_clear(self):
        """
        我->设置->通用->存储空间
        缓存->前往清理 按钮
        清理 按钮
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/c0a")

    @property
    def settings_cache_popup_clear(self):
        """
        我->设置->通用->存储空间
        缓存->前往清理 按钮
        清理 按钮
        弹窗
            -内容：清理缓存可能需要一些时间，清理过程中请耐心等候。
            -按钮：清理
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/guw")

    @property
    def settings_cache_tips(self):
        """
        我->设置->通用->存储空间
        缓存->前往清理 按钮
        清理 按钮

        点过弹窗-按钮 清理，后，
        出现提示 ：

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/cj7")

    @property
    def settings_records_count(self):
        """
        我->设置->通用->存储空间
        聊天记录=正在计算（数据）
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/h2h")

    @property
    def settings_records_manage(self):
        """
        我->设置->通用->存储空间
        聊天记录=>正在计算（数据）
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/lnp")

    @property
    def settings_records_loading(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理
        正在加载…
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/g3r")

    @property
    def settings_records_rows(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理
        信息行
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/kpm")

    @property
    def settings_records_selectAll(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理
        按钮<全选>
        点击全选后，当前元素的text 变为 取消全靠，
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/mll")

    @property
    def settings_records_clear(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理
        按钮<清理>
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/c0a")

    @property
    def settings_records_clearAll(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理->弹窗
        弹窗
        所选范围内无可清理的图片、视频或文件
        所选范围还剩余 16.8 GB 的聊天记录，包括文字、语音、表情等。
        我知道了
        删除所选范围内剩余的聊天记录
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/moa")

    @property
    def settings_records_delete_cache(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理->
        点击清理按钮->弹窗1
        清理按钮

        弹窗示例：
        	清理所选范围内的图片、视频和文件
            你可以在聊天上下文中继续看到这些消息，但是它们无法被打开。

            清理后，将剩余 5.3 GB 的聊天记录，主要包括文字、语音和表情等。
            <取消> <清理 (120.3 MB)>

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/ahd")

    @property
    def settings_records_delete(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理->弹窗->弹窗
        弹窗
        删除所选范围内剩余的聊天记录
        剩余的聊天记录主要包括文字、语音和表情等。
        按钮<删除>
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/aln")

    @property
    def settings_records_delete2(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理->弹窗->弹窗->弹窗
        弹窗
        删除后不可恢复，确定删除？
        按钮<删除>
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/knx")

    @property
    def settings_records_deleting(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理->弹窗->弹窗->弹窗->弹窗
        弹窗
        正在删除: 5%
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/gvj")

    """
    微信好友信息界面
    与企业微信好友 界面元素 通用
    """

    @property
    def friend_first_name(self):
        """
        页面上 最上面 的第一个名字
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bq1", className="android.widget.TextView")

    @property
    def friend_second_name(self):
        """
        当设置备注名称时，页面上会出现第二个名字位置
        昵称 转到 第二个位置
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bq0")

    @property
    def friend_wxid(self):
        """
        好友的微信号   wxid
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bq9")

    @property
    def friend_area(self):
        """
        好友 的地区
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bpz", className="android.widget.TextView")

    @property
    def set_notes(self):
        """
        设置备注和标签 set_notes_and_labels
        当已设置标签后，，变为 标签
        :return:
        """
        # return self.d(resourceId="com.tencent.mm:id/br8")[0]
        return self.d(resourceId="com.tencent.mm:id/isy")[0]

    @property
    def text_view_notes(self):
        """
        通讯录-> 好友row -> 信息界面 -> 设置备注和标签 -> 备注文本框
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bof")

    @property
    def edit_text_notes(self):
        """
         通讯录-> 好友row -> 信息界面 -> 设置备注和标签 -> 备注文本编辑框
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bo5")

    @property
    def button_done(self):
        """
        通讯录-> 好友row -> 信息界面 -> 设置备注和标签 -> 按钮完成，
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/en")

    @property
    def friend_company_name(self):
        """
        好友界面 归属的公司
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bpk")

    @property
    def friend_company_item(self):
        """
        好友信息界面，企业标签
        :return:
        """
        return self.d(text="企业")

    @property
    def friend_depart_item(self):
        """
        好友信息界面的，离职 标签
        :return:
        """
        return self.d(text="已离职")

    @property
    def friend_send_message(self):
        """
        好友信息界面的，发消息
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/khj", text="发消息")

    """
    公众号 信息界面
    """

    @property
    def public_account_items(self):
        """
        公众号 列表 界面 中 条目
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/aip")

    @property
    def public_account_bottom_tip(self):
        """
        公众号 列表 底部 提示
        例：
        19个公众号
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/btz")

    """
    企业好友 信息界面
    """

    @property
    def wxwork_friends_items(self):
        """
        企业微信联系人 界面中 列表的 条目
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/h_0")

    """
    微信群 信息界面
    标题：share_title
    """

    @property
    def room_members(self):
        """
        微信群 信息界面,成员列表
        成员的头像图标，
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/iwa")

    @property
    def room_owner(self):
        """
        微信群 信息界面,成员列表--群主
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/iwa")[0]

    @property
    def room_name_table(self):
        """
        群信息界面
        群聊名称标签，
        :return:
        """
        return self.d(resourceId="android:id/title", text="群聊名称")

    @property
    def room_label_notes(self):
        """
        群信息界面，标签,备注
        :return:
        """
        return self.d(text="备注")

    # @property
    # def room_notes_empty(self):
    #     """
    #     群信息界面
    #    当没有备注名称时，只有 结点 com.tencent.mm:id/ka3，
    #     :return:
    #     """
    #     return self.d(text="备注")

    @property
    def room_notes_text(self):
        """
        群信息界面
        当有备注名称时，在此结点下，会生成，android:id/summary
        :return:
        """
        return self.d(resourceId="android:id/summary")

    @property
    def room_notes_editText(self):
        """
        群信息界面--备注修改界面
        备注输入框
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/gy9", className="android.widget.EditText")

    @property
    def room_notes_done(self):
        """
        群信息界面->备注修改界面
        按钮： 完成

        type :  android.widget.Button
	    name :  com.tencent.mm:id/hfe
	    text :  完成
	    enabled :  False

	    当在输入框中 输入文字后，
	    enabled 变为 True
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/hfe")

    @property
    def room_notes_pop_tip(self):
        """
        群信息界面->备注修改界面
        点击按钮 完成 后，可能出现的弹窗，

        eg:

        你的操作过于频繁，可稍后再试，
        确定，

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/guo")

    @property
    def room_notes_pop_button_ok(self):
        """
        群信息界面->备注修改界面
        点击按钮 完成 后，可能出现的弹窗，

        eg:

        你的操作过于频繁，可稍后再试，
        确定，

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/guw")

    @property
    def room_switchs(self):
        """
        群信息 界面的 开关列表
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bab")

    @property
    def room_switchs_fold(self):
        """
        按钮 折叠该群聊，
        :return:
        """
        return self.d(resourceId="android:id/title", text="折叠该群聊").right(resourceId="com.tencent.mm:id/bab")

    @property
    def room_switch_save_tobook(self):
        """
        群信息界面，保存到通讯录开关按钮
        :return:
        """
        return self.d(resourceId="android:id/title", text="保存到通讯录").right(resourceId="com.tencent.mm:id/bab")

    def room_switch_save_tobook_click(self):
        """
        群信息界面，保存到通讯录开关按钮
        uiautomator2 没有实现 parent
        # android-uiautomator-server not implemented
        :return:
        """
        # return self.d(text="保存到通讯录").parent().sibling("android.widget.FrameLayout").child(
        #     "com.tencent.mm:id/bab")
        return self.d(resourceId="android:id/title", text="保存到通讯录").right(
            resourceId="com.tencent.mm:id/bab").click(timeout=5)

    def room_switch_save_tobook2_click(self):
        """
        群信息界面，保存到通讯录开关按钮
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bab")[2].click(timeout=5)

    @property
    def room_popup_tohide(self):
        """
        第一次点击 折叠 后，会出现弹窗
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bt2")

    @property
    def room_label_saveToBook(self):
        """
        群信息界面，保存到通讯录 标签
        :return:
        """
        return self.d(text="保存到通讯录")

    @property
    def room_label_toFold(self):
        """
        群信息界面，标签,折叠该群聊
        :return:
        """
        return self.d(text="折叠该群聊")

    @property
    def room_button_exit(self):
        """
        群信息界面， <退出群聊> 按钮
        群信息界面， <删除> 按钮
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/khj")

    """
    点击退出群聊后的 弹窗中的两个按钮
    按钮1：
          type :  android.widget.Button 
          name :  com.tencent.mm:id/alm 
          text :  取消 
    按钮2：
          type :  android.widget.Button 
          name :  com.tencent.mm:id/aln 
          text :  退出 
          
          
          
    """

    @property
    def room_popup_exit(self):
        """
        群信息界面，弹窗中的 退出 按钮

        聊天记录空间管理-> 清理
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/aln")

    @property
    def room_popup_del(self):
        """
        删除已退出的群,确定删除，
        tip:
        清空聊天记录，并在聊天列表中删除。
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/knx")


class wechat_2(WeChatBasic):

    def __init__(self, serialno_url):
        super().__init__(serialno_url)
        ##################################################################
        # UI参数是字符串，
        """
        我->设置->通用->存储空间->聊天记录空间管理
        信息行
        :return:
        """
        self.text_settings_records_rows_count = "com.tencent.mm:id/cut"




        ###################################################################
        # UI参数是列表，放的 uiobject的对象，
        # 导航栏
        self.pro_navbar = [self.d(resourceId="com.tencent.mm:id/h6y"), self.d(resourceId="com.tencent.mm:id/huj")]
        self.pro_navbar_me = [self.d(resourceId="com.tencent.mm:id/h6y")[3],
                              self.d(text="我"),
                              self.d(resourceId="com.tencent.mm:id/h7q", text="我"),
                              self.d(resourceId="com.tencent.mm:id/icon_tv", text="我"),
                              self.d(resourceId="com.tencent.mm:id/icon_tv")[3]]
        self.pro_settings_cache_popup_clear = [self.d(resourceId="com.tencent.mm:id/mm_alert_ok_btn"),
                                               self.d(text="清理"),
                                               self.d(resourceId="com.tencent.mm:id/jln")]

    """
    微信首页 界面元素，
    """

    @property
    def navbar(self):
        """
        返回导航栏对象
        activity: com.tencent.mm.ui.LauncherUI
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/huj")

    @property
    def navbar_weixin(self):
        """
        微信 首页 导航栏  微信
        :return:
        """
        # return self.d(resourceId="com.tencent.mm:id/h7q", text="微信")
        return self.d(resourceId="com.tencent.mm:id/h6y")[0]

    @property
    def navbar_book(self):
        """
        微信 首页 导航栏 通讯录
        :return:
        """
        # return self.d(resourceId="com.tencent.mm:id/h7q", text="通讯录")
        return self.d(resourceId="com.tencent.mm:id/h6y")[1]

    @property
    def navbar_discover(self):
        """
         微信 首页 导航栏 发现
         :return:
         """
        # return self.d(resourceId="com.tencent.mm:id/h7q", text="发现")
        return self.d(resourceId="com.tencent.mm:id/h6y")[2]

    @property
    def navbar_me(self):
        """
          微信 首页 导航栏 我
          :return:
        """
        return self.d(resourceId="com.tencent.mm:id/h6y")[3]

    @property
    def navbar_me_2(self):
        """
        微信 首页 导航栏 我  第2种选定方式，
        为了IQOO手机，
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/h7q", text="我")

    # # 微信导航--微信， 界面元素
    @property
    def weixin_title_bar(self):
        """
        微信导航--微信,上部 标题栏

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/hb")

    @property
    def share_title(self):
        """
        微信导航--微信,上部,标题栏中 的标题
                其实在当前界面有两个，
                上级结点不一样，
                1 上级 android:id/content
                2 上级 com.tencent.mm:id/do

        群 信息界面的标题，
        导航-通讯录 界面 的标题，
        导航-通讯录-群聊 界面的标题
        type :  android.widget.TextView
	    name :  android:id/text1
	    text :  聊天信息(161)

        导航-发现 界面的标题

        :return: 元素列表
        """
        return self.d(resourceId="android:id/text1")

    @property
    def weixin_button_search(self):
        """
        微信导航--微信,上部,标题栏中 搜索按钮
        在 MEIZU 手机中，这相结点名与 其它手机的不一样，所以判断一下，
        :return:
        """
        # if self.d(resourceId="com.tencent.mm:id/meb").wait(timeout=1):
        #     return self.d(resourceId="com.tencent.mm:id/meb")
        # else:
        #     return self.d(resourceId="com.tencent.mm:id/gsl")
        # TODO:暂时先用一个，
        return self.d(resourceId="com.tencent.mm:id/meb")

    @property
    def weixin_input_box(self):
        """
        通用元素
        微信导航--微信--按钮 搜索 --输入框
        通讯录 -> 群聊 => 按钮<搜索> -> 搜索框
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/d98")

    @property
    def weixin_search_results(self):
        """
        微信导航--微信--按钮 搜索 --输入框
        输入文字后，会自动 出结果
        结果是列表，
        :return: 列表，
        """
        return self.d(resourceId="com.tencent.mm:id/odf")

    @property
    def weixin_bottom_navigation_bar(self):
        """
        微信导航--微信,底部导航栏的 上级框架总结点
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/huj")

    @property
    def table_rows(self):
        """
        微信导航--微信，信息流，元素列表
        通讯录页面，好友标签 列表
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/kbq")

    @property
    def bth_redtip(self):
        """
        红点提示，
        腾讯新闻，好友信息，企业通知 ，微信群
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/o_u")

    @property
    def bth_redtip2(self):
        """
        红点提示，
        # # 公众号，订阅号，折叠的群聊，
        :return:
        """
        # TODO: 暂时没有红点
        return self.d(resourceId="com.tencent.mm:id/a_h")

    @property
    def bth_redtip_name(self):
        """
        红点,所在的bth,聊天hg4,名字,
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/o_u").right(resourceId="com.tencent.mm:id/kbq")

    """
    微信导航--微信--功能--折叠的群聊
    """

    @property
    def weixin_FoldedRooms_title(self):
        """
        微信导航--微信--功能--折叠的群聊 界面的标题
        type :  android.widget.TextView
	    name :  com.tencent.mm:id/ko4
	    text :  折叠的群聊

        :return:
        """
        return self.d(text="折叠的群聊")

    """
    微信导航--微信，-聊天窗口界面，界面元素
    聊天窗口，界面
    包括与好友聊天，
    包括与群聊天，
    包括与公众号等等，

    """

    @property
    def chat_interface_back(self):
        """
        聊天窗口，左上角 < 返回按钮，
        做成通用的，

        :return:
        """
        # TODO:先用这个，等报错了，再调试
        return self.d(resourceId="com.tencent.mm:id/he")

    @property
    def chat_interface_back1(self):
        """
        聊天窗口，左上角 < 返回按钮，
        微信支付,微信团队,服务通知,折叠的群聊,公众号,好友,微信群

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/a4p")

    @property
    def chat_interface_back2(self):
        """
        聊天窗口，左上角 < 返回按钮，
        腾讯新闻,,订阅号消息

        :return:
        """
        # TODO:暂时没有，先不改，
        return self.d(resourceId="com.tencent.mm:id/g1")

    @property
    def subscription_account(self):
        """
        订阅号，
        :return:
        """
        return self.d(description="订阅号消息")

    @property
    def chat_interface_title_common(self):
        """
        聊天窗口，上标题
        通用的选择方法，包括好友，微信群，微信功能，公众号等等，
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/gp").child(className="android.widget.TextView")

    @property
    def chat_interface_title(self):
        """
        与好友，聊天窗口，上标题
        群 聊天窗口，上标题，
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/obn")

    @property
    def chat_interface_title2(self):
        """
        与好友，聊天窗口，上标题
        群 聊天窗口，上标题，

        在折叠的群聊中   群聊天界面，会出现两个 ko4
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/obn")[1]

    @property
    def chat_interface_info(self):
        """
        聊天窗口，右上角 ...
        与好友聊天窗口，与群聊天窗口，通用
        type :  android.widget.ImageView
	    name :  com.tencent.mm:id/eo
	    desc :  聊天信息

        :return:
        """
        # if self.d(resourceId="com.tencent.mm:id/eo").wait(timeout=0.5):
        return self.d(resourceId="com.tencent.mm:id/fq")
        # elif self.d(resourceId="com.tencent.mm:id/eq").wait(timeout=0.5):
        #     return self.d(resourceId="com.tencent.mm:id/eq")
        # else:
        #     raise Exception("没有找到元素，右上角三个点")

    @property
    def chat_interface_edittext(self):
        """
        聊天窗口界面的输入框
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bkk")
        # if self.d(resourceId="com.tencent.mm:id/b4a").wait(timeout=1):
        #     print("聊天窗口界面的输入框 : {}".format("com.tencent.mm:id/b4a"))
        #     return self.d(resourceId="com.tencent.mm:id/b4a")
        # if self.d(className="android.widget.EditText").wait(timeout=1):
        #     print("聊天窗口界面的输入框 : {}".format("android.widget.EditText"))
        #     return self.d(className="android.widget.EditText")
        # print("聊天窗口界面的输入框 : {}".format('//android.widget.EditText'))
        # return self.d.xpath('//android.widget.EditText')

    @property
    def chat_interface_send(self):
        """
        聊天窗口界面
        输入框=> 按钮<发送>
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bql", className="android.widget.Button")

    @property
    def chat_interface_removed_tip(self):
        """
        当前微信用户被移出群聊，再进入群聊，会出现提示
        type :  android.widget.TextView
	    name :  com.tencent.mm:id/b59
	    text :  无法在已退出的群聊中发送消息
        被移出群聊后显示：无法在已退出的群聊中发送消息
        群主解散群后显示：无法在已停用的群聊中发送消息

        公众号的导航 菜单栏，也是b59
        例：
        d(resourceId="com.tencent.mm:id/b59", text="小程序商城")
        d(resourceId="com.tencent.mm:id/b59", text="话机通信")
        d(resourceId="com.tencent.mm:id/b59", text="会员服务")
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/bln")

    # 微信导航--通讯录， 界面元素
    @property
    def book_new_friend(self):
        """
        通讯录界面，新的朋友
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/obc")

    @property
    def book_room(self):
        """
        通讯录中的 群聊 标签，
        :return:
        """
        return self.d(text="群聊")

    @property
    def book_room_rows(self):
        """
        通讯录 => 群聊 -> 群列表
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/cg1")

    @property
    def book_room_search(self):
        """
        通讯录--群聊--搜索框
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/jgr")

    @property
    def book_friend_invitations(self):
        """
        通讯录=> 好友邀请提示
        :return:
        """

        return self.d(resourceId="com.tencent.mm:id/g_9")

    @property
    def book_label_newfriend(self):
        """
        通讯录=> 新的朋友
        :return:
        """
        return self.d(text="新的朋友")

    @property
    def new_friends_add(self):
        """
        按钮添加朋友
        :return:
        """
        return self.d(text="添加朋友")

    @property
    def new_friend_accept(self):
        """
        接受按钮
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/g_8", className="android.widget.Button")

    @property
    def new_friend_through(self):
        """
        通过好友验证界面的标题，
        :return:
        """
        return self.d(text="通过朋友验证")

    @property
    def new_friend_accept_done(self):
        """
        通过好友验证界面的 完成按钮
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/g68")

    @property
    def book_public_account(self):
        """
        通讯录中的公众号标签，
        :return:
        """
        return self.d(text="公众号")

    @property
    def book_wxwork_friends(self):
        """
        通讯录中的 企业微信联系人 标签
        :return:
        """
        return self.d(text="企业微信联系人")

    @property
    def book_friend_row(self):
        """
        通讯录中的，好友信息行，

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/kbq", className="android.widget.TextView")

    @property
    def book_bottom_tip(self):
        """
        通讯录 底部的 提示，
        例：
                226个朋友
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/caj")

    # 微信导航--我， 界面元素
    @property
    def me_nick_name(self):
        """
        当前微信号的 昵称
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/kbb")

    @property
    def me_wxid(self):
        """
        当前微信的 wxid
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/ouv")

    @property
    def me_settings(self):
        """
        页面 我
        按钮<设置>
        :return:
        """
        return self.d(resourceId="android:id/title", text="设置")

    @property
    def me_settings_title(self):
        """
        我->设置
        标题 设置
        :return:
        """
        return self.d(resourceId="android:id/text1", text="设置")

    @property
    def settings_universal(self):
        """
        我->设置
        按钮<通用>
        :return:
        """
        return self.d(resourceId="android:id/title", text="通用")

    @property
    def settings_universal_title(self):
        """
        我->设置->通用
        标题 通用
        :return:
        """
        return self.d(resourceId="android:id/text1", text="通用")

    @property
    def settings_storage_space(self):
        """
        我->设置->通用
        按钮 <存储空间>
        :return:
        """
        return self.d(resourceId="android:id/title", text="存储空间")

    @property
    def settings_storage_space_title(self):
        """
        我->设置->通用->存储空间
        标题 存储空间
        :return:
        """
        return self.d(resourceId="android:id/text1", text="存储空间")

    @property
    def settings_all_space(self):
        """
        我->设置->通用->存储空间
        微信已用空间
            --正在计算（空间数据）
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/pjo")

    @property
    def settings_cache_count(self):
        """
        我->设置->通用->存储空间
        缓存->正在计算（缓存数据）
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/b4v")

    @property
    def settings_goto_clear(self):
        """
        我->设置->通用->存储空间
        缓存->前往清理 按钮
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/pjh")

    @property
    def settings_cache_clear(self):
        """
        我->设置->通用->存储空间
        缓存->前往清理 按钮
        清理 按钮
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/crz")

    @property
    def settings_cache_popup_clear(self):
        """
        我->设置->通用->存储空间
        缓存->前往清理 按钮
        清理 按钮
        弹窗
            -内容：清理缓存可能需要一些时间，清理过程中请耐心等候。
            -按钮：清理
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/jln")

    @property
    def settings_cache_tips(self):
        """
        我->设置->通用->存储空间
        缓存->前往清理 按钮
        清理 按钮

        点过弹窗-按钮 清理，后，
        出现提示 ：
        tip:没有可清理的内容

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/dft")

    @property
    def settings_records_count(self):
        """
        我->设置->通用->存储空间
        聊天记录=正在计算（数据）
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/ju6")

    @property
    def settings_records_manage(self):
        """
        我->设置->通用->存储空间
        聊天记录=> 管理
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/pji")

    @property
    def settings_records_loading(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理
        正在加载…
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/iml")

    @property
    def settings_records_rows(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理
        信息行
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/odf")

    @property
    def settings_records_selectAll(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理
        按钮<全选>
        点击全选后，当前元素的text 变为 取消全选，

        通过text的变化，可以判断，是否已经点击
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/mi1", text="全选")

    @property
    def settings_records_clear(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理
        按钮<清理>
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/crz")

    @property
    def settings_records_clearAll(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理->
        点击清理按钮->弹窗2
        弹窗：
        所选范围内无可清理的图片、视频或文件
        所选范围还剩余 16.8 GB 的聊天记录，包括文字、语音、表情等。
        [我知道了]
        <除所选范围内剩余的聊天记录>
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/av7")

    @property
    def settings_records_delete_cache(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理->
        点击清理按钮->弹窗1
        清理按钮

        弹窗示例：
        	清理所选范围内的图片、视频和文件
            你可以在聊天上下文中继续看到这些消息，但是它们无法被打开。

            清理后，将剩余 5.3 GB 的聊天记录，主要包括文字、语音和表情等。
            <取消> <清理 (120.3 MB)>

        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/b0f")

    @property
    def settings_records_delete(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理->弹窗->弹窗
        弹窗
        删除所选范围内剩余的聊天记录
        剩余的聊天记录主要包括文字、语音和表情等。
        按钮<删除>
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/b0f")

    @property
    def settings_records_delete2(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理->弹窗->弹窗->弹窗
        弹窗
        删除后不可恢复，确定删除？
        按钮<删除>
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/obc")

    @property
    def settings_records_deleting(self):
        """
        我->设置->通用->存储空间->聊天记录空间管理->弹窗->弹窗->弹窗->弹窗
        弹窗
        正在删除: 5%
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/jma")

    """
    微信好友信息界面
    与企业微信好友 界面元素 通用
    """

    @property
    def friend_first_name(self):
        """
        页面上 最上面 的第一个名字
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/cf8", className="android.widget.TextView")

    @property
    def friend_second_name(self):
        """
        当设置备注名称时，页面上会出现第二个名字位置
        昵称 转到 第二个位置
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/cf7")

    @property
    def friend_wxid(self):
        """
        好友的微信号   wxid
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/cff")

    @property
    def friend_area(self):
        """
        好友 的地区
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/cf6", className="android.widget.TextView")

    @property
    def set_notes(self):
        """
        设置备注和标签 set_notes_and_labels
        当已设置标签后，，变为 标签
        :return:
        """
        # return self.d(resourceId="com.tencent.mm:id/br8")[0]
        return self.d(resourceId="com.tencent.mm:id/m38")[0]

    @property
    def text_view_notes(self):
        """
        通讯录-> 好友row -> 信息界面 -> 设置备注和标签 -> 备注文本框
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/cdk")

    @property
    def edit_text_notes(self):
        """
         通讯录-> 好友row -> 信息界面 -> 设置备注和标签 -> 备注文本编辑框
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/cdb")

    @property
    def button_done(self):
        """
        通讯录-> 好友row -> 信息界面 -> 设置备注和标签 -> 按钮完成，
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/fp")

    @property
    def friend_company_name(self):
        """
        好友界面 归属的公司
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/ceq")

    @property
    def friend_company_item(self):
        """
        好友信息界面，企业标签
        :return:
        """
        return self.d(text="企业")

    @property
    def friend_depart_item(self):
        """
        好友信息界面的，离职 标签
        :return:
        """
        return self.d(text="已离职")

    @property
    def friend_send_message(self):
        """
        好友信息界面的，发消息
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/o3b", text="发消息")

    """
    公众号 信息界面
    """

    @property
    def public_account_items(self):
        """
        公众号 列表 界面 中 条目
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/awx")

    @property
    def public_account_bottom_tip(self):
        """
        公众号 列表 底部 提示
        例：
        19个公众号
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/cjm")

    """
    企业好友 信息界面
    """

    @property
    def wxwork_friends_items(self):
        """
        企业微信联系人 界面中 列表的 条目
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/k3e")

    """
    微信群 信息界面
    标题：share_title
    """

    @property
    def room_members(self):
        """
        微信群 信息界面,成员列表
        成员的头像图标，
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/m7e")

    @property
    def room_owner(self):
        """
        微信群 信息界面,成员列表--群主
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/m7e")[0]

    @property
    def room_name_table(self):
        """
        群信息界面
        群聊名称标签，
        :return:
        """
        return self.d(resourceId="android:id/title", text="群聊名称")

    @property
    def room_label_notes(self):
        """
        群信息界面，标签,备注
        :return:
        """
        return self.d(text="备注")

    # @property
    # def room_notes_empty(self):
    #     """
    #     群信息界面
    #    当没有备注名称时，只有 结点 com.tencent.mm:id/ka3，
    #     :return:
    #     """
    #     return self.d(text="备注")

    @property
    def room_notes_text(self):
        """
        群信息界面
        当有备注名称时，在此结点下，会生成，android:id/summary
        :return:
        """
        return self.d(resourceId="android:id/summary")

    @property
    def room_notes_editText(self):
        """
        群信息界面--备注修改界面
        备注输入框
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/jpm", className="android.widget.EditText")

    @property
    def room_notes_done(self):
        """
        群信息界面->备注修改界面
        按钮： 完成

        type :  android.widget.Button
	    name :  com.tencent.mm:id/hfe
	    text :  完成
	    enabled :  False

	    当在输入框中 输入文字后，
	    enabled 变为 True
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/kao")

    @property
    def room_notes_pop_tip(self):
        """
        群信息界面->备注修改界面
        点击按钮 完成 后，可能出现的弹窗，

        eg:

        你的操作过于频繁，可稍后再试，
        确定，

        :return:
        """
        # TODO:,暂时没有，
        return self.d(resourceId="com.tencent.mm:id/guo")

    @property
    def room_notes_pop_button_ok(self):
        """
        群信息界面->备注修改界面
        点击按钮 完成 后，可能出现的弹窗，

        eg:

        你的操作过于频繁，可稍后再试，
        确定，

        :return:
        """
        # TODO:,暂时没有，
        return self.d(resourceId="com.tencent.mm:id/guw")

    @property
    def room_switchs(self):
        """
        群信息 界面的 开关列表
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/btf")

    @property
    def room_switchs_fold(self):
        """
        按钮 折叠该群聊，
        :return:
        """
        return self.d(resourceId="android:id/title", text="折叠该群聊").right(resourceId="com.tencent.mm:id/btf")

    @property
    def room_switch_save_tobook(self):
        """
        群信息界面，保存到通讯录开关按钮
        :return:
        """
        return self.d(resourceId="android:id/title", text="保存到通讯录").right(resourceId="com.tencent.mm:id/btf")

    def room_switch_save_tobook_click(self):
        """
        群信息界面，保存到通讯录开关按钮
        uiautomator2 没有实现 parent
        # android-uiautomator-server not implemented
        :return:
        """
        # return self.d(text="保存到通讯录").parent().sibling("android.widget.FrameLayout").child(
        #     "com.tencent.mm:id/bab")
        return self.d(resourceId="android:id/title", text="保存到通讯录").right(
            resourceId="com.tencent.mm:id/btf").click(timeout=5)

    def room_switch_save_tobook2_click(self):
        """
        群信息界面，保存到通讯录开关按钮
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/btf")[2].click(timeout=5)

    @property
    def room_popup_tohide(self):
        """
        第一次点击 折叠 后，会出现弹窗
        :return:
        """
        # todo:
        return self.d(resourceId="com.tencent.mm:id/cil")

    @property
    def room_label_saveToBook(self):
        """
        群信息界面，保存到通讯录 标签
        :return:
        """
        return self.d(text="保存到通讯录")

    @property
    def room_label_toFold(self):
        """
        群信息界面，标签,折叠该群聊
        :return:
        """
        return self.d(text="折叠该群聊")

    @property
    def room_button_exit(self):
        """
        群信息界面， <退出群聊> 按钮
        群信息界面， <删除> 按钮
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/o3b")

    """
    点击退出群聊后的 弹窗中的两个按钮
    按钮1：
          type :  android.widget.Button 
          name :  com.tencent.mm:id/alm 
          text :  取消 
    按钮2：
          type :  android.widget.Button 
          name :  com.tencent.mm:id/aln 
          text :  退出 



    """

    @property
    def room_popup_exit(self):
        """
        群信息界面，弹窗中的 退出 按钮

        聊天记录空间管理-> 清理
        :return:
        """
        # return self.d(resourceId="com.tencent.mm:id/aln")
        return self.d(resourceId="com.tencent.mm:id/b0f")

    @property
    def room_popup_del(self):
        """
        删除已退出的群,确定删除，
        tip:
        清空聊天记录，并在聊天列表中删除。
        :return:
        """
        return self.d(resourceId="com.tencent.mm:id/obc")

    @navbar_me.setter
    def navbar_me(self, value):
        self._navbar_me = value

    @navbar.setter
    def navbar(self, value):
        self._navbar = value


#
# def click_wait_for_disappearance(ui: UiObject):
#     """
#     点击 ui 元素，并等待元素消失，
#     如果元素没有消失，则再次点击，
#     :return:
#     """
#     # 等待元素出现，默认是1.44秒 检查一次，默认超时是120秒
#     # 确定UI元素出现后再点击，
#     logger.debug("click_wait_for_disappearance,进入")
#     ui.wait(timeout=3.0)
#     ui.click()
#     # logger.debug("点击 三点  更多信息")
#     start = time.time()
#     # logger.debug("点击UI元素")
#     # wait_for_disappearance,会强制重新获取节点状态，避免节点已经存在、又消失后
#     time.sleep(sleep_for_polling_interval)
#     while ui.wait(timeout=3.0):
#         logger.debug("click_wait_for_disappearance,再次点击UI元素")
#         ui.click()
#         time.sleep(sleep_for_polling_interval)
#         if time.time() - start > timeout:
#             raise Exception('点击后，UI元素没有消失，超时了，请检查')


def click_wait_for_appearance(ui: UiObject, apper_ui: UiObject):
    """
    点击 ui 元素，
    并等待新的元素出现，
    :return:
    """
    logger.debug("click_wait_for_appearance,进入")
    start = time.time()
    while True:
        if ui.wait(timeout=5):
            ui.click()
        if time.time() - start > wechat_timeout:
            raise Exception('点击后，UI元素没有出现，超时了，请检查')
        if apper_ui.wait(timeout=sleep_for_polling_interval):
            break
        logger.debug("click_wait_for_appearance,进入循环判断")


def click_wait_for_appearance2(ui: UiObject, *args):
    """
    点击 ui 元素，
    并等待新的元素出现，
    :return:
    """
    logger.debug("click_wait_for_appearance2,进入")
    start = time.time()
    while True:
        if ui.wait(timeout=5):
            ui.click()
        if time.time() - start > wechat_timeout:
            break
            # raise Exception('点击后，UI元素没有出现，超时了，请检查')
        flag = False
        for arg in args:
            if arg.wait(timeout=sleep_for_polling_interval):
                flag = True
                break
        if flag:
            break
        logger.debug("click_wait_for_appearance,进入循环判断")


if __name__ == '__main__':
    pass
